import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Random;

public class BigCodeDemo {
    public static void main(String[] args) {
//        //获取一个随机的大整数
//        Random r=new Random();
//        // 获取0-2的三次幂之间的数-1 也就是0-7
//        BigInteger bi = new BigInteger(3,r); //获取一个3位的随机大整数
//        System.out.println(bi+"-bi");

//        //获取一个指定的大整数
//        BigInteger bi2 = new BigInteger("1234567890");
//        System.out.println(bi2+"-bi2");

//        //获取一个指定进制的大整数
//        BigInteger bi3 = new BigInteger("1234567890",10);
//        System.out.println(bi3+"-bi3");//十进制的100
//        输入的数如果不符合进制规则会报错
//        例如 2进制 不准出现0和1以外的数

//        静态方法获取BigInteger的对象 内部有优化
//        -16到16之间的数 会直接从缓存中返回已经创建好的对象
//        能表示的范围较小 在long的取值范围之类，如果超出long范围就不行了
//        BigInteger bi4 = BigInteger.valueOf(312321321321322L);
//        System.out.println(bi4+"-bi4");

//        对象一旦创建，BigInteger内部记录的值不能发生改变
//        如果BigInteger表示的超出long范围，可以用构造方法获取
//        BigInteger bi2 = new BigInteger("123456783213213290"); //构造方法获取方式
//        只要计算都会创建一个新的BigInteger对象

//        断点调试可以查看存储过程


        /**
         * BigDecimal
         * 用于表示精确的小数，例如财务计算
         * 解决计算失去精度的问题
         * 小数精度比Double和Float更精确
         * 构造方法：
         * BigDecimal(String val)
         * BigDecimal(double val)
         * BigDecimal(BigInteger val)
         */

        //这种方式有可能是不精确的 不建议使用
//        BigDecimal bd1 = new BigDecimal(0.01);
//        BigDecimal bd2 = new BigDecimal(0.09);
//        System.out.println(bd1);//0.01000000000000000020816681711721685132943093776702880859375
//        System.out.println(bd2);//0.0899999999999999966693309261245303787291049957275390625

        //建议使用字符串构造方法
//        BigDecimal bd1 = new BigDecimal("0.01");
//        BigDecimal bd2 = new BigDecimal("0.09");
//        BigDecimal bd3 = bd1.add(bd2);
//        System.out.println(bd1);//0.01
//        System.out.println(bd2);//0.09
//        System.out.println(bd3);//0.10

         /**
          * 细节：
          * 1. 字符串构造方法可以表示任意精度的小数
          * 2. 建议使用字符串构造方法创建BigDecimal对象
          * 3.如果要表示的数字不大，建议使用double静态方法创建BigDecimal对象
          * 示例：
          * BigDecimal bd5=BigDecimal.valueOf(0.01);
          * 4.如果要表示的数字较大，建议使用字符串构造方法创建BigDecimal对象 （字符串生成BigDecimal）
          * 示例：
          * BigDecimal bd2 = new BigDecimal("0.09");
          *
          * 4.内部优化 如果传递的是0-10之间的整数，会直接从缓存中返回已经创建好的对象 不会重新new 所以直接比较地址值是true
          * */


    }
}
